@echo off
REM 数据库迁移脚本 (Windows版本)

setlocal enabledelayedexpansion

REM 颜色定义
set "RED=[ERROR]"
set "GREEN=[SUCCESS]"
set "YELLOW=[WARNING]"
set "BLUE=[INFO]"

REM 默认参数
set "VENV_NAME=venv"
set "MIGRATION_TYPE=upgrade"
set "TARGET_REVISION=head"

REM 显示帮助信息
:show_help
echo 数据库迁移脚本 (Windows版本)
echo.
echo 用法: %0 [选项]
echo.
echo 选项:
echo     /h, /help              显示帮助信息
echo     /venv ^<name^>           虚拟环境名称 (默认: venv)
echo     /upgrade [revision]    升级到指定版本 (默认: head)
echo     /downgrade ^<revision^>  降级到指定版本
echo     /current               显示当前版本
echo     /history               显示迁移历史
echo     /init                  初始化迁移环境
echo.
echo 示例:
echo     %0                     升级到最新版本
echo     %0 /current            显示当前数据库版本
echo     %0 /downgrade -1       回退一个版本
echo     %0 /init               初始化迁移环境
goto :eof

REM 解析命令行参数
:parse_args
if "%~1"=="" goto :check_params
if /i "%~1"=="/h" goto :show_help
if /i "%~1"=="/help" goto :show_help
if /i "%~1"=="/venv" (
    set "VENV_NAME=%~2"
    shift
    shift
    goto :parse_args
)
if /i "%~1"=="/upgrade" (
    set "MIGRATION_TYPE=upgrade"
    if not "%~2"=="" if not "%~2:~0,1%"=="/" (
        set "TARGET_REVISION=%~2"
        shift
    )
    shift
    goto :parse_args
)
if /i "%~1"=="/downgrade" (
    set "MIGRATION_TYPE=downgrade"
    set "TARGET_REVISION=%~2"
    shift
    shift
    goto :parse_args
)
if /i "%~1"=="/current" (
    set "MIGRATION_TYPE=current"
    shift
    goto :parse_args
)
if /i "%~1"=="/history" (
    set "MIGRATION_TYPE=history"
    shift
    goto :parse_args
)
if /i "%~1"=="/init" (
    set "MIGRATION_TYPE=init"
    shift
    goto :parse_args
)
echo %RED% 未知参数: %~1
goto :show_help

:check_params
REM 参数验证
if "%MIGRATION_TYPE%"=="downgrade" if "%TARGET_REVISION%"=="" (
    echo %RED% 降级操作需要指定目标版本
    exit /b 1
)

REM 日志函数
:log_info
echo %BLUE% %~1
goto :eof

:log_success
echo %GREEN% %~1
goto :eof

:log_warning
echo %YELLOW% %~1
goto :eof

:log_error
echo %RED% %~1
goto :eof

REM 检查虚拟环境
:check_venv
call :log_info "检查虚拟环境..."

if not exist "%VENV_NAME%" (
    call :log_error "虚拟环境 %VENV_NAME% 不存在"
    echo 请先运行 setup_venv.bat 创建虚拟环境
    exit /b 1
)

if not exist "%VENV_NAME%\Scripts\activate.bat" (
    call :log_error "虚拟环境激活脚本不存在"
    exit /b 1
)

call :log_success "虚拟环境检查通过"
goto :eof

REM 激活虚拟环境
:activate_venv
call :log_info "激活虚拟环境..."
call "%VENV_NAME%\Scripts\activate.bat"
goto :eof

REM 检查Alembic配置
:check_alembic
call :log_info "检查Alembic配置..."

if not exist "alembic.ini" (
    call :log_error "alembic.ini配置文件不存在"
    exit /b 1
)

if not exist "alembic" (
    call :log_error "alembic目录不存在"
    exit /b 1
)

REM 检查Alembic是否安装
alembic --version >nul 2>&1
if errorlevel 1 (
    call :log_error "Alembic未安装"
    echo 请在虚拟环境中安装: pip install alembic
    exit /b 1
)

call :log_success "Alembic配置检查通过"
goto :eof

REM 初始化迁移环境
:init_migration
call :log_info "初始化迁移环境..."

if exist "alembic" (
    call :log_warning "迁移环境已存在"
    set /p confirm="是否重新初始化? (y/N): "
    if /i not "!confirm!"=="y" (
        call :log_info "取消初始化"
        goto :eof
    )
    rmdir /s /q alembic
)

alembic init alembic
if errorlevel 1 (
    call :log_error "初始化失败"
    exit /b 1
)

call :log_success "迁移环境初始化完成"
call :log_info "请编辑 alembic.ini 配置数据库连接字符串"
goto :eof

REM 显示当前版本
:show_current
call :log_info "获取当前数据库版本..."

alembic current
if errorlevel 1 (
    call :log_error "获取当前版本失败"
    exit /b 1
)
goto :eof

REM 显示迁移历史
:show_history
call :log_info "显示迁移历史..."

alembic history --verbose
if errorlevel 1 (
    call :log_error "获取迁移历史失败"
    exit /b 1
)
goto :eof

REM 执行升级
:run_upgrade
call :log_info "执行数据库升级到: %TARGET_REVISION%"

echo ================================================
echo 数据库迁移 - 升级操作
echo ================================================
echo 目标版本: %TARGET_REVISION%
echo 执行时间: %date% %time%
echo ================================================
echo.

alembic upgrade %TARGET_REVISION%
if errorlevel 1 (
    call :log_error "数据库升级失败"
    exit /b 1
)

call :log_success "数据库升级完成"
goto :eof

REM 执行降级
:run_downgrade
call :log_warning "执行数据库降级到: %TARGET_REVISION%"

echo ================================================
echo 数据库迁移 - 降级操作 (危险操作)
echo ================================================
echo 目标版本: %TARGET_REVISION%
echo 执行时间: %date% %time%
echo ================================================
echo.

set /p confirm="确认执行降级操作? 这可能导致数据丢失! (y/N): "
if /i not "%confirm%"=="y" (
    call :log_info "取消降级操作"
    goto :eof
)

alembic downgrade %TARGET_REVISION%
if errorlevel 1 (
    call :log_error "数据库降级失败"
    exit /b 1
)

call :log_success "数据库降级完成"
goto :eof

REM 检查数据库连接
:check_database_connection
call :log_info "检查数据库连接..."

REM 尝试连接数据库 (简化版本)
python -c "from core.database import engine; engine.connect()" >nul 2>&1
if errorlevel 1 (
    call :log_warning "数据库连接失败，请检查配置"
) else (
    call :log_success "数据库连接正常"
)
goto :eof

REM 备份数据库
:backup_database
call :log_info "建议在迁移前备份数据库"
echo.
echo 备份命令示例:
echo   PostgreSQL: pg_dump -U username -h host database_name ^> backup.sql
echo   MySQL: mysqldump -u username -p database_name ^> backup.sql
echo   SQLite: .backup backup.db (在sqlite3命令行中)
echo.
set /p continue="是否继续执行迁移? (y/N): "
if /i not "%continue%"=="y" (
    call :log_info "取消迁移操作"
    exit /b 0
)
goto :eof

REM 主函数
:main
title 校园视频孪生系统 - 数据库迁移

call :log_info "开始数据库迁移操作..."

REM 检查虚拟环境
call :check_venv
if errorlevel 1 exit /b 1

REM 激活虚拟环境
call :activate_venv

REM 根据操作类型执行相应操作
if /i "%MIGRATION_TYPE%"=="init" (
    call :init_migration
    goto :end
)

REM 检查Alembic配置
call :check_alembic
if errorlevel 1 exit /b 1

REM 检查数据库连接
call :check_database_connection

if /i "%MIGRATION_TYPE%"=="current" (
    call :show_current
) else if /i "%MIGRATION_TYPE%"=="history" (
    call :show_history
) else if /i "%MIGRATION_TYPE%"=="upgrade" (
    if /i not "%TARGET_REVISION%"=="head" (
        call :backup_database
        if errorlevel 1 goto :end
    )
    call :run_upgrade
    if errorlevel 1 exit /b 1
) else if /i "%MIGRATION_TYPE%"=="downgrade" (
    call :backup_database
    if errorlevel 1 goto :end
    call :run_downgrade
    if errorlevel 1 exit /b 1
)

call :log_success "数据库迁移操作完成！"

:end
pause
goto :eof

REM 解析参数并执行主函数
call :parse_args %*
call :main